import axios from 'axios'
import store from '@/store'
// 通过局部引入方式引入Element的Message功能
import { Message } from 'element-ui'
// 引入urouter
import router from '@/router'
// 引入qs，
import qs from 'qs'

// create创建axios实例
const request = axios.create({
  timeout: 5000
})

let isRefreshing = false
let requests = []

console.log(requests)
request.interceptors.request.use(function (config) {
  // 判断config.url的前缀，来进行请求baseURL的设置
  config.baseURL = getBaseURL(config.url)
  // 统一设置token信息
  var { user } = store.state
  if (user && user.access_token) {
    config.headers.Authorization = user.access_token
  }
  return config
})

// 添加响应拦截器
request.interceptors.response.use(function (response) {
  // 对响应数据做点什么
  // console.log('响应成功')
  return response;
}, function (error) {
  // 对响应错误做点什么
  console.dir(error);
  if (error.response) {
    // 请求发送成功，响应接收完毕，但是状态码为失败
    console.log(error.response.data)
    const { status } = error.response
    let errorMessage = ''
    console.log(status)
    if (status === 400) {
      errorMessage = '请求参数错误'
    } else if (status === 401) {
      // 1、没有Token信息
      if (!store.state.user) {
        // 跳转到登录页面
        redirectLogin()
        return Promise.reject(error);
      }
      // 检测是否已经存在正在刷新Token的操作
      if (isRefreshing) {
        // 存储待执行的函数
        requests.push(() => {
          request(error.config)
        })
        return
      }
      isRefreshing = true
      // Token失效
      // 发送请求，获取新的access_token
      request({
        method: 'POST',
        url: '/front/user/refresh_token',
        data: qs.stringify({
          refreshtoken: store.state.user.refresh_token
        })
      }).then(res => {
        console.log(res)
        // 1、刷新失败
        if (res.data.state !== 1) {
          // 清楚无效的用户信息
          store.commit('setUser', null)
          redirectLogin()
          return Promise.reject(error);
        }
        // 2、成功刷新
        store.commit('setUser', res.data.content)
        requests.forEach(callback => callback())
        requests = []
        return request(error.config)
      }).catch(err => {
        console.log(err)
      }).finally(() => {
        isRefreshing = false
      })
      return Promise.reject(error);
    } else if (status === 403) {
      errorMessage = '没有权限，请联系管理员'
    } else if (status === 404) {
      errorMessage = '请求资源不存在'
    } else if (status === 500) {
      errorMessage = '服务端错误，请联系管理员'
    }
    // console.log(errorMessage)
    Message.error(errorMessage)
  } else if (error.request) {
    // 请求发送成功，但未收到响应
    console.log(error.request)
    Message.error('请求超时，请稍后重试')
  } else {
    // 意料之外的错误
    Message.error(error.message)
    // console.log('Error', error.message)
  }
  // 将本次错误的对象继续向后抛出，让接收响应的处理函数进行操作
  return Promise.reject(error);
});

function getBaseURL (url) {
  if (url.startsWith('/boss')) {
    return 'http://eduboss.lagou.com'
  }
  return 'http://edufront.lagou.com'
}

function redirectLogin () {
  router.push({
    name: 'login',
    query: {
      // currentRoute 就是存储了路由信息的对象
      redirect: router.currentRoute.fullPath
    }
  })
}
export default request
